/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.gestionpymes.x.mock;

import py.gestionpymes.seguridad.servicios.UsuarioDAO;
import py.gestionpymes.seguridad.servicios.RolDAO;
import py.gestionpymes.seguridad.servicios.AccionDAO;
import py.gestionpymes.seguridad.persistencia.Usuario;
import py.gestionpymes.seguridad.persistencia.Rol;
import py.gestionpymes.seguridad.persistencia.Accion;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import py.gestionpymes.adm.servicios.ColorDAO;
import py.gestionpymes.adm.servicios.ConfRedDAO;
import py.gestionpymes.adm.servicios.EmpresaDAO;
import py.gestionpymes.adm.servicios.ImpuestoIVADAO;
import py.gestionpymes.adm.servicios.MonedaDAO;
import py.gestionpymes.adm.servicios.SucursalDAO;
import py.gestionpymes.cobranza.servicios.CobranzaService;
import py.gestionpymes.cobranza.servicios.PagoDAO;
import py.gestionpymes.proveedores.servicios.ProveedorService;
import py.gestionpymes.stock.servicios.ProductoDAO;
import py.gestionpymes.adm.persistencia.ConfRed;
import py.gestionpymes.adm.persistencia.Empresa;
import py.gestionpymes.adm.persistencia.ImpuestoIVA;
import py.gestionpymes.adm.persistencia.Moneda;
import py.gestionpymes.adm.persistencia.Nacionalidad;
import py.gestionpymes.adm.persistencia.Pais;
import py.gestionpymes.adm.persistencia.Sucursal;
import py.gestionpymes.adm.servicios.NacionalidadDAO;
import py.gestionpymes.adm.servicios.PaisDAO;
import py.gestionpymes.clientes.persistencia.DetCuentaCliente;
import py.gestionpymes.clientes.persistencia.OperacionDesembolsoPrestamo;
import py.gestionpymes.clientes.persistencia.enums.TipoDocumento;
import py.gestionpymes.cobranza.persistencia.CobroCuota;
import py.gestionpymes.cobranza.persistencia.DetCobroCuota;
import py.gestionpymes.cobranza.persistencia.Efectivo;
import py.gestionpymes.proveedores.persistencia.Proveedor;
import py.gestionpymes.prestamos.persistencia.PeriodoPago;
import py.gestionpymes.prestamos.persistencia.Prestamo;
import py.gestionpymes.prestamos.persistencia.SistemaAmortizacion;
import py.gestionpymes.stock.persistencia.Color;
import py.gestionpymes.stock.persistencia.Producto;

/**
 *
 * @author christian
 */
@Named
@ApplicationScoped
public class Mock implements Serializable {

    @EJB
    private ColorDAO colorDAO;
    @EJB
    private ProductoDAO productoDAO;
    @EJB
    private RolDAO rolDAO;
    @EJB
    private UsuarioDAO usuarioDAO;
    @EJB
    private ProveedorService proveedorDAO;
    @EJB
    private AccionDAO accionDAO;
    @EJB
    private ImpuestoIVADAO impuestoIVADAO;
    @EJB
    private MonedaDAO monedaDAO;
    @EJB
    private EmpresaDAO empresaDAO;
    @EJB
    private SucursalDAO sucursalDAO;
    @EJB
    private ConfRedDAO confRedDAO;
    @EJB
    private PagoDAO pagoDAO;
    @EJB
    private CobranzaService cobranzaService;
    @EJB
    private PaisDAO paisDAO;
    private List<Producto> productos;
    private List<Color> colores;
    private List<Proveedor> proveedores;
    private List<Rol> roles;
    private List<Usuario> usuarios;
    private List<ImpuestoIVA> impuestoIVAs;
    private List<Moneda> monedas;
    private List<Empresa> empresas;
    private List<Sucursal> sucursales;
    private ConfRed confRed;
    private Prestamo prestamo;
    private Nacionalidad nacionalidad;

    public Mock() {
    }

    public void creaDatos() {
        if (colores == null) {
            creaColores();
        }
        if (productos == null) {
            creaProductos();
        }
        if (proveedores == null) {
            creaProveedores();
        }
        if (roles == null) {
            creaRoles();
        }
        if (usuarios == null) {
            creaUsuarios();
        }

        if (impuestoIVAs == null) {
            creaImpuestosIVA();
        }

        if (monedas == null) {
            creaMonedas();
        }

        if (empresas == null) {
            creaEmpresas();
        }

        if (sucursales == null) {
            creaSucursales();
        }

        if (confRed == null) {
            creaConfRed();
        }
        if (prestamo == null) {
            creaPrestamo();
        }



    }

    private void creaColores() {
        colores = new ArrayList<Color>();
        colores.add(new Color("Negro", "Black", "ne", "#000000"));
        colores.add(new Color("Rojo", "Red", "ro", "#990000"));
        colores.add(new Color("Amarillo", "Yellow", "am", "#CCCC00"));
        colores.add(new Color("Verde", "Green", "ve", "#33CC00"));
        colores.add(new Color("Dorado", "Gold", "do", "#FF9900"));
        for (Color c : colores) {
            colorDAO.create(c);
        }
    }

    private void creaProductos() {
        productos = new ArrayList<Producto>();
        productos.add(new Producto(1L, "01", "P1"));
        productos.add(new Producto(2L, "02", "P2"));
        productos.add(new Producto(3L, "03", "P3"));
        productos.add(new Producto(4L, "04", "P4"));
        for (Producto p : productos) {
            productoDAO.create(p);
        }
    }

    private void creaImpuestosIVA() {
        impuestoIVAs = new ArrayList<ImpuestoIVA>();
        impuestoIVAs.add(new ImpuestoIVA("IVA 10%", 0.1D));
        impuestoIVAs.add(new ImpuestoIVA("IVA 5%", 0.05D));
        for (ImpuestoIVA i : impuestoIVAs) {
            impuestoIVADAO.create(i);
        }
    }

    private void creaProveedores() {
        proveedores = new ArrayList<Proveedor>();
        proveedores.add(new Proveedor("Pepe", "123456", "pe"));
        proveedores.add(new Proveedor("Pedro", "123", "pd"));
        proveedores.add(new Proveedor("Pablo", "456", "pa"));
        proveedores.add(new Proveedor("Juan", "874", "ju"));
        proveedores.add(new Proveedor("Alberto", "4531", "al"));
        proveedores.add(new Proveedor("Martin", "3213", "ma"));
        proveedores.add(new Proveedor("Luis", "35123", "lu"));
        for (Proveedor p : proveedores) {
            proveedorDAO.create(p);
        }

    }

    private void creaRoles() {
        roles = new ArrayList<Rol>();
        Rol rolAdmin = new Rol("Admin");
        roles.add(rolAdmin);
        roles.add(new Rol("Invitado"));
        for (Rol r : roles) {
            rolDAO.create(r);
        }

        creaAcciones(rolAdmin);
    }

    private void creaUsuarios() {
        usuarios = new ArrayList<Usuario>();

        usuarios.add(new Usuario("Administrator",
                "",
                new Date(),
                "admin",
                "admin",
                rolDAO.find("Admin"),
                TipoDocumento.CI,
                "3404671"));

        for (Usuario u : usuarios) {
            usuarioDAO.create(u);
        }
    }

    private void creaAcciones(Rol rol) {
        String[] acciones = {"VisualizaEmpresa",
            "CreaEmpresa",
            "EditaEmpresa",
            "VisualizaProveedor",
            "CreaProveedor",
            "EditaProveedor",
            "CargaDeStock",
            "Inventario",
            "VisualizaUnidadMedida",
            "CreaUnidadMedida",
            "EditaUnidadMedida",
            "VisualizaFamilia",
            "CreaFamilia",
            "EditaFamilia",
            "VisualizaProducto",
            "CreaProducto",
            "EditaProducto",
            "VisualizaSucursal",
            "CreaSucursal",
            "EditaSucursal",
            "VisualizaObra",
            "CreaObra",
            "EditaObra",
            "CreaCliente",
            "ConfRed",
            "VisualizaUsuario",
            "CreaUsuario",
            "EditaUsuario",
            "VisualizaRol",
            "EditaRol",
            "CreaRol",
            "VisualizaMoneda",
            "EditaMoneda",
            "CreaMoneda",
            "VisualizaDeposito",
            "EditaDeposito",
            "CreaDeposito",
            "CreaOrdenCompra",
            "VisualizaOrdenCompra",
            "EditaOrdenCompra",
            "CreaPrestamo",
            "VisualizaPrestamo",
            "CobraCuotaPrestamo",
            "CreaPais",
            "VisualizaPais",
            "EditaPais",
            "CreaDepartamento",
            "VisualizaDepartamento",
            "EditaDepartamento",
            "CreaDistrito",
            "VisualizaDistrito",
            "EditaDistrito",
            "CreaLocalidad",
            "VisualizaLocalidad",
            "EditaLocalidad"};


        for (int i = 0; i < acciones.length; i++) {
            Accion a = new Accion(acciones[i]);
            accionDAO.create(a);

            a.setRoles(new ArrayList<Rol>());
            a.getRoles().add(rol);

            rol.getAcciones().add(a);
        }

        rolDAO.edit(rol);

    }

    private void creaMonedas() {
        monedas = new ArrayList<Moneda>();
        monedas.add(new Moneda("Guaraníes", "Gs", 0, true));
        monedas.add(new Moneda("Dólar", "$", 0, false));
        for (Moneda m : monedas) {
            monedaDAO.create(m);
        }
    }

    private void creaEmpresas() {
        empresas = new ArrayList<Empresa>();
        empresas.add(new Empresa("CVSA", "123456"));


        for (Empresa e : empresas) {
            empresaDAO.create(e);
        }
    }

    private void creaSucursales() {
        Empresa e = empresaDAO.find("CVSA");
        sucursalDAO.create(new Sucursal(e, "Central"));
    }

    private void creaConfRed() {
        confRed = new ConfRed(false, "", 0, "confproxy");
        confRedDAO.create(confRed);
    }

    private void creaPrestamo() {
        prestamo = new Prestamo();

        prestamo.setCapital(1000000);
        prestamo.setGastos(200000);
        prestamo.setPlazo(12);
        prestamo.setTasa(24);
        prestamo.setPeriodoPago(PeriodoPago.MENSUAL);
        prestamo.setSistemaAmortizacion(SistemaAmortizacion.FRANCES);

        DetCuentaCliente de = new OperacionDesembolsoPrestamo(prestamo);

    }

    public Prestamo getPrestamo() {
        return prestamo;
    }

    public void paga(Prestamo prestamo) {
        CobroCuota cc = new CobroCuota(prestamo);
        Efectivo efe = new Efectivo();
        efe.setFecha(new Date());
        efe.setMoneda(monedaDAO.find("Guaraníes"));
        efe.setMonto(50000d);
        pagoDAO.create(efe);

        DetCobroCuota dcc = new DetCobroCuota();
        dcc.setPago(efe);
        dcc.setMonto(efe.getMonto());
        dcc.setCobroCuota(cc);
        dcc.setDetPrestamo(prestamo.getDetalles().get(0));
        dcc.setFecha(new Date());
        List<DetCobroCuota> detallesCobro = new ArrayList<DetCobroCuota>();
        detallesCobro.add(dcc);
        cc.setDetalles(detallesCobro);

        cobranzaService.create(cc);
    }
}
